import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { babel } from '@rollup/plugin-babel'
import eslintPlugin from 'vite-plugin-eslint'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { resolve } from 'path' // 主要用于alias文件路径别名
import DefineOptions from 'unplugin-vue-define-options/vite'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    babel({ babelHelpers: 'bundled' }),
    eslintPlugin({
      include: ['src/**/*.*', 'src/*.*']
    }),
    AutoImport({
      resolvers: [ElementPlusResolver()],
      imports: ['vue', 'vue-router'],
      dts: '/auto-import.d.ts',
      eslintrc: {
        enabled: true // 1、改为true用于生成eslint配置。2、生成后改回false，避免重复生成消耗
      }
    }),
    Components({
      resolvers: [ElementPlusResolver()]
    }),
    DefineOptions()
  ], define: {
    'process.env': process.env
  },
  base: './', // 在生产中服务时的基本公共路径
  publicDir: 'public', // 静态资源服务的文件夹, 默认"public"
  resolve: {
    alias: {
      '@': resolve(__dirname, './src') // 这里是将src目录配置别名为 @ 方便在项目中导入src目录下的文件
    },
    extensions: ['.js', '.vue', '.json'] // 忽略.vue后缀
  },
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "@/styles/global.scss";`
      }
    }
  },
  json: {
    // 是否支持从 .json 文件中进行按名导入
    namedExports: true,
    // 若设置为 true 导入的json会被转为 export default JSON.parse("..") 会比转译成对象字面量性能更好
    stringify: false
  },
  server: {
    host: '127.0.0.1', // 指定服务器主机名
    port: 3000, // 指定服务器端口
    open: true, // 在服务器启动时自动在浏览器中打开应用程序
    strictPort: false, // 设为 false 时，若端口已被占用则会尝试下一个可用端口,而不是直接退出
    https: false, // 是否开启 https
    cors: true, // 为开发服务器配置 CORS。默认启用并允许任何源
    proxy: {
      // 配置代理
      '/api': {
        target: 'http://192.168.43.4:8000/api',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    }
  },
  // 打包配置
  build: {
    // 浏览器兼容性  "esnext"|"modules"
    target: 'modules',
    // 指定输出路径
    outDir: 'dist',
    // 生成静态资源的存放路径
    assetsDir: 'assets',
    // 小于此阈值的导入或引用资源将内联为 base64 编码，以避免额外的 http 请求。设置为 0 可以完全禁用此项
    assetsInlineLimit: 4096,
    // 启用/禁用 CSS 代码拆分
    cssCodeSplit: true,
    // 构建后是否生成 source map 文件
    sourcemap: false,
    // 自定义底层的 Rollup 打包配置
    rollupOptions: {
      // make sure to externalize deps that should not be bundled
      // into your library
      input: {
        main: resolve(__dirname, 'src/components/main.ts')
      },
      external: ['vue', 'golden-layout']
    },
    // @rollup/plugin-commonjs 插件的选项
    commonjsOptions: {
    },
    // 构建的库
    lib: {
    },
    // 当设置为 true，构建后将会生成 manifest.json 文件
    manifest: false,
    // 设置为 false 可以禁用最小化混淆，
    // 或是用来指定使用哪种混淆器
    // boolean | 'terser' | 'esbuild'
    minify: 'terser', // terser 构建后文件体积更小
    // 传递给 Terser 的更多 minify 选项。
    terserOptions: {
    },
    // 设置为 false 来禁用将构建后的文件写入磁盘
    write: true,
    // 默认情况下，若 outDir 在 root 目录下，则 Vite 会在构建时清空该目录。
    emptyOutDir: true,
    // 启用/禁用 brotli 压缩大小报告
    brotliSize: true,
    // chunk 大小警告的限制
    chunkSizeWarningLimit: 500
  },
  ssr: {
    // 列出的是要为 SSR 强制外部化的依赖
    external: [],
    // 列出的是防止被 SSR 外部化依赖项
    noExternal: []
  }
})
